package com.tf_cut.backend.util;

import com.tf_cut.backend.mapper.ConfigSettingMapper;
import com.tf_cut.backend.payment.pojo.ConfigSetting;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 配置信息工具类
 */
@Component
public class ConfigSettingUtil {
    private Logger logger = LogManager.getLogger(ConfigSettingUtil.class);

    private static Map<String,Map<String,String>> configMap = new HashMap<String, Map<String, String>>();

    private static Map<String, String> carBin = new HashMap<String, String>();

    @Resource
    private ConfigSettingMapper mapper;

    /**
     * 通过配置类型和配置名获取配置信息（单条）
     * @param configType  配置类型
     * @param configName  配置名
     * @return 配置值
     */
    public String getConfigValue(String configType, String configName){
        logger.info("加载配置信息：" + configType);
        Map<String, String> values  = configMap.get(configType);
        //如果没有该类型下的配置信息，初始化该类型配置
        if(values == null){
            values = new HashMap<String, String>();
            List<ConfigSetting> list = mapper.queryConfigByType(configType);

            for(ConfigSetting cs : list){
                values.put(cs.getConfigName(), cs.getConfigValue());
            }


            logger.info("没有找到该配置，初始化完毕，共加载" + list.size() + "条配置信息");
            configMap.put(configType, values);
        }

        String value = values.get(configName);
        logger.info("configType:[" + configType + "],configName:[" + configName + "],configValue:[" + value + "].");
        return value;
    }


    /**
     * 通过配置类型获取该类型下所有配置信息（多条）
     * @param configType  配置类型
     * @return 配置值
     */
    public Map<String,String> getConfigValuesMap(String configType){
        logger.info("加载配置信息：" + configType);
        Map<String, String> values  = configMap.get(configType);
        //如果没有该类型下的配置信息，初始化该类型配置
        if(values == null){
            values = new HashMap<String, String>();
            List<ConfigSetting> list = mapper.queryConfigByType(configType);

            for(ConfigSetting cs : list){
                values.put(cs.getConfigName(), cs.getConfigValue());
            }


            logger.info("没有找到该配置，初始化完毕，共加载" + list.size() + "条配置信息");
            configMap.put(configType, values);
        }

        return values;
    }
    
    /**
     * 通过配置类型获取该类型下所有配置信息（多条）
     * @param configType  配置类型
     * @return 配置值
     */
    public Map<String,String> reloadConfigSetting(String configType){
        logger.info("重新加载加载配置信息：" + configType);
        Map<String, String> values  = new HashMap<String, String>();
        //如果没有该类型下的配置信息，初始化该类型配置
            List<ConfigSetting> list = mapper.queryConfigByType(configType);

            for(ConfigSetting cs : list){
                values.put(cs.getConfigName(), cs.getConfigValue());
            }


            logger.info("没有找到该配置，初始化完毕，共加载" + list.size() + "条配置信息");
            configMap.put(configType, values);

        return values;
    }

    /**
     * 通过配置类型获取该类型下所有配置信息（多条）
     * @param configType  配置类型
     * @return 配置值
     */
    public List<String> getConfigValuesList(String configType){
        Map<String, String> values  = getConfigValuesMap(configType);
        List<String> list = new ArrayList<>();

        for(String value : values.values()){
            list.add(value);
        }

        return list;
    }

    /**
     * 获取银行编码
     * 如果缓存中存在直接获取，如果缓存不存在则初始化缓存
     * @param bankName
     * @return
     */
    public String getCardBinByBankName(String bankName){
        if(carBin.size() == 0){
            logger.info("初始化第三方支付所需银行编码配置信息...");
            getConfigValue("payment_cardbin","");
            carBin = configMap.get("payment_cardbin");
        }
        String bankNo = carBin.get(bankName);
        logger.info("银行名：[" + bankName + "],银行编码:[" + bankNo + "].");
        return bankNo;
    }
}
